home *** CD-ROM | disk | FTP | other *** search
- Subject: v06i068: VT100TOOL for Sun's (vt100tool), Part09/10
- Newsgroups: mod.sources
- Approved: rs@mirror.UUCP
-
- Submitted by: linus!ell (Ed Lafferty)
- Mod.sources: Volume 6, Issue 68
- Archive-name: vt100tool/Part09
-
- [ I generally dislike posting anything other than source code. In this
- case, however, I'm making an exception because (a) there's no other
- way to do it; and (b) there is apparently a lot of demand for this
- program. So, I took the object and data files in the fontdir and
- libdir directories and uuencode'd them. The decode.sh script in the
- toplevel directory will uudecode them and remove the uu.xxx files;
- it lists the files by name, so you can check if you're missing
- something. This comment will appear at the beginning of each of the
- postings of this program. --r$ ]
-
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line,
- # then unpack it by saving it in a file and typing "sh file".
- # Wrapped by rs@mirror.UUCP on Thu Jul 17 00:22:14 EDT 1986
- # Contents: src/ttyvt100.c src/vt100keys.c MANIFEST
-
- echo x - src/ttyvt100.c
- sed 's/^XX//' > "src/ttyvt100.c" <<'@//E*O*F src/ttyvt100.c//'
- XX#ifndef lint
- XXstatic char sccsid[] = "@(#)ttyvt100.c 1.16 86/06/25 Copyr 1985 MITRE Corp.";
- XX#endif
-
- XX/*
- XX * Copyright (c) 1985 by MITRE Corporation
- XX */
-
- XX#include <stdio.h>
- XX#include <pixrect/pixrect_hs.h>
- XX#include <sunwindow/window_hs.h>
- XX#include <signal.h>
- XX#include <ctype.h>
-
- XX#include <sys/ioctl.h>
- XX#include <sun/fbio.h>
- XX#include <sundev/kbio.h>
- XX#include <sundev/kbd.h>
-
- XX#undef DEBUG
- XXint debug = 0; /* to enable any debugging you must */
- XXint debug2 = 0; /* Define DEBUG and set one of the */
- XXint debug1 = 0; /* debug flags */
- XXint debug4 = 0;
- XXint debug3 = 0;
- XXint debug5 = 0;
- XXint debug6 = 0;
- XXint debug7 = 0;
- XXint debug8 = 0;
- XX#include <sunwindow/cms_grays.h>
- XX#include "ttysw_impl.h"
- XX#include "ttyvt100.h"
- XX#include "charimage.h"
- XX#include "charscreen.h"
- XX#define vanillaChar(c) ((c >= ' ') && (c <= '~'))
- XXchar ansiCharBuf[CHAR_BUF_LEN];
- XXextern struct pixwin *csr_pixwin;/* This is the ttysw windowfd */
- XXextern struct pixfont *pixfont; /* This is what csr_init uses ???? */
- XXextern int chrwidth;
- XXextern int right,top,bottom,left;
- XXextern pstring(),bold(),nobold();
- XXextern void init_kbd();
-
-
- XX/* Logical state of window and program switches */
- XXint graf_norm, bold_norm;
- XXint curscol = 0; /* cursor column */
- XXint cursrow = 0; /* cursor row */
- XXint state = ALPHA; /* ALPHA,VT52, ESCBRKT, ESCBRKTQM, etc, */
- XXint state1 = 0; /* holds EATCHARS flag at last column */
- XXint vl = 0; /* accumulate vt52 first arg */
- XXint ac = 0; /* accumulates last arg in ESCBRKT sequences. 0-->1. */
- XXint ac0 = 0; /* ditto, but next to last arg. 0 ==> 1 */
- XXint acinit = 0; /* initial value of ac (with 0 left alone) */
- XXint acinit0 = 0; /* ditto for first Pn */
- XXint acm[10]; /* array of parameters */
- XXint ac_num = 0; /* number of parms this time */
- XXint scroll_top = 0; /* definition of top of scrolling region */
- XXint scroll_bottom = 23; /* bottom of scrolling region */
- XXint fillfunc = 0; /* 1 -> boldf */
- XXint underscore; /* 1 -> underscore */
- XXint report = 0; /* 1-7 if host asks for something */
-
- XX/* dimensions of VT100 window */
- XXint vtop = 0; /* top row of vt100 window */
- XXint vbottom = 23; /* bottom row of vt100 window */
- XXint vleft = 0; /* left column of vt100 window */
- XXint vright = 79; /* right column of regular vt100 window */
- XXint tabArray[MAX_SCREEN_WIDTH]; /* array for setting tabs */
-
- XX/* VT100 mode variables */
- XXint origin_mode = 0; /* 0 == reset (screen upper left corner) */
- XX /* 1 == set (upper -left within margins) */
- XXint newline = 0; /* also used by ttysw_main */
- XXint local = 0; /* 1 = local, 0 = online */
- XXint cursor; /* 0 -> NOCURSOR, 1 -> UNDERCURSOR, */
- XX /* 2 -> BLOCKCURSOR */
- XXint curs_key = 0; /* ANSI cursor key mode [ or O*/
- XXchar answer_message[31]; /* holds the answerback message */
- XXint repeat = 0; /* not implemented */
- XXint interlace = 0; /* not implemented */
- XXint vt52mode = 0; /* emulate a vt52 display */
- XXint appl_key_ansi = 0; /* ANSI application keypad mode */
- XXint wrap = 0; /* wrap at margin mode */
- XXint big_screen = 0; /* 132 col mode */
- XXint smooth_scroll = 0; /* not implemented */
-
- XXint rev_screen = 0; /* reverse initial setup BOW or WOB */
- XXint alt_keypad_52 = 0; /* vt52 keypad mode */
- XXint half_chrwidth = 5; /* for 132 col mode */
- XXint full_chrwidth = 8; /* for 80 col mode */
- XXint twice_chrwidth = 16; /* for 40 col modes */
- XXint twelve_tenths_chrwidth = 10; /* for 66 col mode */
- XXint g0,g1; /* to keep character set modes */
- XXint activeCharset = G0; /* graf or asc */
- XXint graph_52 = 0; /* graphics vt52 mode flag */
- XXchar charStr[2] = "c"; /* for writing a single character in vright */
- XXchar *charNext;
- XXchar *charBufMax;
- XXint curscolStart;
-
- XX/* we will keep a font designator for each character */
- XX/* so the repair routine will work. Also, need it for rewrite() */
- XX
- XX/*
- XX * Interpret a string of characters of length <len>. Stash and restore
- XX * the cursor indicator.
- XX *
- XX * Note that characters with the high bit set will not be recognized.
- XX * This is good, for it reserves them for ASCII-8 X3.64 implementation.
- XX * It just means all sources of chars which might come here must mask
- XX * parity if necessary.
- XX *
- XX */
- XXansiinit()
- XX{
- XX int i;
- XX underscore = 0;
- XX curscol = vleft;
- XX cursrow = vtop;
- XX/* setupfullgraycolormap(); */
- XX for (i = 0; i < MAX_SCREEN_WIDTH; i++) tabArray[i] = 0;
- XX for (i = 0; i < MAX_SCREEN_WIDTH; i = i + 8) tabArray[i]=1;
-
- XX g0 = ASC;
- XX g1 = GRAPH;
- XX#ifdef DEBUG
- XX if (debug) printf( "to imageinit...\n");
- XX#endif DEBUG
- XX imageinit();
- XX init_kbd();
- XX set_font(5);
- XX return(1);
- XX}
-
-
- XX/* compatibility kludge */
- XXgfxstring(addr, len)
- XX char *addr;
- XX int len;
- XX{
- XX extern struct ttysubwindow *_ttysw;
- XX if(len ==1 && *addr == '\014') /* map a ^L into vt100 clear */
- XX {
- XX addr = "\033[2J";
- XX len = 4;
- XX }
- XX ttysw_output(_ttysw, addr, len);
- XX}
-
- XXttysw_output(ttysw, addr, len0)
- XX struct ttysubwindow *ttysw;
- XX register char *addr;
- XX int len0;
- XX{
- XX register char c;
- XX int i;
- XX register int len;
- XX char buffer[30]; /* put string to send back to host here */
- XX char string[30];
- XX removeCursor();
- XX for (len = len0; !ttysw->ttysw_frozen && len > 0; len--) {
-
- XX /* this is the main loop */
- XX c = *addr++; /* Fetch next char from string */
- XX /* and bump pointer */
- XX switch(state){
-
- XX case ALPHA:
-
- XX ac = 0;
- XX acinit = 0;
- XX acinit0 = 0;
- XX ac0 = 0;
- XX ac_num = 0;
- XX for (i=0; i<9; i++,acm[i]=0); /* clear parm array */
-
- XX switch (c) { /* Do control characters first */
- XX case '\000' : break; /* null character */
- XX case '\005' : answerback(); break;
- XX case CTRL(G): blinkscreen(); break;
- XX case CTRL(H): pos(curscol-1,cursrow);
- XX#ifdef DEBUG
- XX if(debug)printf("backspace\n");
- XX#endif DEBUG
- XX break;
- XX case CTRL(I):
- XX for (i = curscol+1; i <= vright; i++){
- XX if (tabArray[i])
- XX {
- XX pos(i,cursrow);
- XX break;
- XX }
- XX }
- XX if(i >= vright)
- XX pos(vright, cursrow);
- XX break;
- XX
- XX case CTRL(J): /* linefeed */
- XX case CTRL(K): /* VT interpret as LF */
- XX case CTRL(L): /* FF " " " */
- XX Index();
- XX break;
-
- XX case CTRL(M):
- XX if(newline)
- XX {
- XX pos( 0,cursrow);
- XX Index();
- XX }
- XX else pos( 0, cursrow);
- XX break;
- XX case CTRL(N): G1_select();
- XX break;
- XX case CTRL(O): G0_select();
- XX break;
- XX case '\033': state = ESCAPE;
- XX break;
-
- XX
- XX default: /* c is likely a real alpha character */
- XX if (c < 32) break; /* guess not! */
- XX if(curscol > vright) /* means we have written into last column */
- XX {
- XX switch (wrap)
- XX {
- XX case 1:
- XX curscol = 0;
- XX pos(curscol,cursrow);
- XX Index();
- XX break;
- XX case 0: /* eat the character */
- XX charStr[0] = c;
- XX writePartialLine(charStr,vright);
- XX reflections[cursrow][vright] = marks[cursrow] + (fillfunc<<8);
- XX goto loopback;
- XX }
- XX }
- XX
- XX /* and now handle the normal case "curscol not vright" */
- XX curscolStart = curscol; /* initialize for loop */
- XX charNext = &ansiCharBuf[0];
- XX *charNext = c; /* put character into output stream */
- XX charNext++; /* and bump stream pointer */
- XX marks[cursrow] |= BUSY;
- XX reflections[cursrow][curscol] = marks[cursrow] + (fillfunc<<8);
- XX curscol++; /* and bump column */
- XX *charNext = '\0';
- XX writePartialLine(&ansiCharBuf[0], curscolStart); /* and write to screen */
- XX break;
- XX }
- XX break;
-
- XX case ESCAPELPRN:
- XX switch (c){
- XX case 'A': g0 = UK;
- XX grafon();
- XX if(activeCharset == G0) set_font(5);
- XX break;
- XX
- XX case '1':
- XX case '2':
-
- XX case 'B': g0 = ASC;
- XX grafon();
- XX if(activeCharset == G0) set_font(5);
- XX break;
- XX case '0': g0 = GRAPH;
- XX grafon();
- XX if(activeCharset == G0) set_font(5);
- XX break;
- XX default: break;
- XX }
- XX state = ALPHA;
- XX break;
- XX case ESCAPERPRN:
- XX switch (c){
- XX case 'A': g1 = UK;
- XX grafon();
- XX if(activeCharset == G1) set_font(5);
- XX break;
- XX case '1':
- XX case '2':
- XX case 'B': g1 = ASC;
- XX grafon();
- XX if(activeCharset == G1) set_font(5);
- XX break;
- XX case '0': g1 = GRAPH;
- XX grafon();
- XX if(activeCharset == G1) set_font(5);
- XX break;
- XX default: break;
- XX }
- XX state = ALPHA;
- XX break;
- XX case ESCAPESHARP:
- XX switch (c){
- XX case '8': Escreen();
- XX break;
- XX case '3': mark_top(cursrow);
- XX break;
- XX
- XX case '4': mark_bottom(cursrow);
- XX break;
- XX case '5': clear_width(cursrow);
- XX break;
- XX case '6': mark_wide(cursrow);
- XX break;
- XX default: break;
- XX }
- XX state = ALPHA;
- XX break;
- XX
-
- XX case ESCBRKT: /* esc[ accumulate parms */
- XX case ESCBRKTQM: /* same logic for esc[? */
- XX if ('0' <= c && c <= '9') {
- XX ac = ((char)ac)*10 + c - '0'; /* char for inline muls */
- XX break;
- XX } else if (c == ';') {
- XX
- XX acm[ac_num] = ac;
- XX ac_num++;
- XX ac0 = ac; ac = 0; /* for compat up */
- XX break;
- XX } else {
- XX if(c != '?'){
- XX acinit = ac; /* got a alpha */
- XX acinit0 = ac0; /* default both Pns */
- XX acm[ac_num] = ac;
- XX ac_num++;
- XX if(ac0 == 0 && ac != 0 && ac_num == 1)
- XX {
- XX ac0 = ac; /* if only one then it isthe first */
- XX ac = 0;
- XX }
- XX if(ac0 == 0) ac0 = 1; /* default is 1 not 0 */
- XX if(ac ==0) ac = 1;
- XX#ifdef DEBUG
- XX if(debug) printf("acs %d %d %d %d\n",acinit,ac0,ac,ac_num);
- XX#endif DEBUG
- XX }
- XX if (state == ESCBRKT){
- XX#ifdef DEBUG
- XX if(debug) printf("in CSI %c sequence\n",c);
- XX#endif DEBUG
- XX switch ( c ) {
- XX case 'A': pos(curscol,cursrow-ac0); break;
- XX case 'B': pos(curscol,cursrow+ac0); break;
- XX case 'C': pos(curscol+ac0,cursrow); break;
- XX case 'D': pos(curscol-ac0,cursrow); break;
- XX case 'f':
- XX case 'H': abs_pos(ac-1,ac0-1);
- XX break;
- XX case 'J':
- XX switch(acinit){
- XX case 0: cleol(cursrow);
- XX del_lines(cursrow+1,vbottom);
- XX clearMarks(cursrow+1,vbottom);
- XX set_font(5);
- XX break;
- XX case 1: del_char(vleft,curscol, cursrow);
- XX del_lines(vtop,cursrow-1);
- XX clearMarks(vtop,cursrow-1);
- XX set_font(5);
- XX break;
- XX case 2:
- XX del_lines(vtop,vbottom);
- XX clearMarks(vtop,vbottom);
- XX set_font(5);
- XX break;
- XX }
- XX break;
- XX case 'K':
- XX switch(acinit){
- XX case 0:
- XX cleol(cursrow);
- XX break;
- XX case 1:
- XX del_char( vleft, curscol,cursrow);
- XX break;
- XX case 2:
- XX del_char(vleft,curscol,cursrow);
- XX cleol(cursrow);
- XX break;
- XX }
- XX break;
- XX case '?': state = ESCBRKTQM;
- XX break;
- XX/* for now just bold and nobold */
- XX case 'm': /* attributes on/off */
- XX if(ac_num == 0)
- XX {
- XX acm[0] = acinit;
- XX ac_num++;
- XX }
- XX for( i = 0; i < ac_num; i++)
- XX {
- XX switch(acm[i]){
- XX case 0: All_off();
- XX break;
- XX case 1: Bold_on();
- XX break;
- XX case 4: Under_on();
- XX break;
- XX case 5: Blink_on();
- XX break;
- XX case 7: Reverse_on();
- XX break;
- XX }
- XX }
- XX#ifdef DEBUG
- XXif(debug4) printf("attributes %d %d %d %d %d\n", acm[0],acm[1],acm[2],acm[3],acm[4]);
- XX#endif DEBUG
- XX break;
- XX/* reports coming up */
- XX case 'c': /*report what are you? */
- XX ttysw_input(_ttysw,"\033[?1;0c",7);
- XX break;
- XX/* tabs clear */
- XX case 'g': if(acinit == 0 ) {
- XX tabArray[curscol] = 0;
- XX break;}
- XX if(acinit == 3){
- XX for(i = 0; i<= MAX_SCREEN_WIDTH-1;i++)
- XX tabArray[i] = 0;}
- XX break;
- XX/* line feed mode set */
- XX case 'h': if(acinit == 20) newline = 1;
- XX break;
- XX/* line feed node reset */
- XX case 'l': if(acinit == 20) newline = 0;
- XX break;
- XX/* status requests from host */
- XX case 'n': if(acinit == 5)
- XX ttysw_input(_ttysw,"\033[0n",4);
- XX
- XX if(acinit == 6)
- XX {
- XX sprintf(string,"\033[%u;%uR",cursrow+1,curscol+1);
- XX ttysw_input(_ttysw,string,strlen(string));
- XX }
- XX break;
- XX/* define scroll region for indexing */
- XX case 'r': set_scroll_region(); break;
- XX/* report terminal parameters */
- XX case 'x': if(acinit == 0)
- XX ttysw_input(_ttysw,"\033[2;1;1;112;112;1;0x",20);
- XX if(acinit == 1)
- XX ttysw_input(_ttysw,"\033[3;1;1;112;112;1;0x", 20);
- XX break;
- XX case 'q': /* led business - ignore */ break;
-
- XX } /* end of ESCBRKT switch */
- XX if(state == ESCBRKT) state = ALPHA;
- XX ac = 0;
- XX ac0 = 0;
- XX acinit = 0;
- XX acinit0 = 0;
- XX break;
- XX } /* not ESCBRKT must be [? */
- XX
- XXif(state == ESCBRKTQM){ /* must be esc[? */
- XX#ifdef DEBUG
- XX if(debug)printf("esc-[? %c\n",c);
- XX#endif DEBUG
- XX switch (c){
- XX case 'h':
- XX switch(acinit){
- XX case 1: curs_key = 1; break;
- XX case 3: big_screen = 1;
- XX vright = 131;
- XX del_lines(vtop,vbottom);
- XX clearMarks(vtop,vbottom);
- XX ac_num = 0;
- XX scroll_top = vtop;
- XX scroll_bottom = vbottom;
- XX pos(0,0);
- XX set_font(5);
- XX break;
- XX case 4: smooth_scroll=1;
- XX break;
- XX
- XX case 5: if(rev_screen==0){
- XX rev_screen = 1;
- XX pblack_background();
- XX }
- XX break;
- XX case 6: origin_mode=1;
- XX pos(vleft,scroll_top);
- XX break;
- XX case 7: wrap = 1; break;
- XX case 8: repeat = 1; break;
- XX case 9: interlace=1; break;
- XX default: break;
- XX }
- XX state = ALPHA;
- XX break;
- XX case 'l':
- XX switch(acinit){
- XX case 1: curs_key = 0; break;
- XX case 2: vt52mode = 1;
- XX wrap = 1;
- XX scroll_top = vtop;
- XX scroll_bottom = vbottom;
- XX break;
- XX case 3: big_screen=0;
- XX vright = 79;
- XX clearMarks(vtop,vbottom);
- XX del_lines(vtop,vbottom);
- XX ac_num = 0;
- XX scroll_top = vtop;
- XX scroll_bottom = vbottom;
- XX pos(0,0);
- XX set_font(5);
- XX break;
- XX case 4: smooth_scroll=0;
- XX break;
- XX case 5: if(rev_screen==1){
- XX rev_screen = 0;
- XX pwhite_background();
- XX }
- XX break;
- XX case 6: origin_mode=0;
- XX pos(vleft,vtop);
- XX break;
- XX case 7: wrap = 0; break;
- XX case 8: repeat = 0; break;
- XX case 9: interlace = 0; break;
- XX default: break;
- XX }
- XX state = ALPHA;
- XX break;
- XX default: /* esc[? something unknown? */
- XX state = ALPHA;
- XX break;
- XX } /* end of esc[? switch */
- XX state = ALPHA;
- XX } /* end of esc[? conditional */
- XX } /* ends esc[ and esc[? section */
- XX ac = 0;
- XX ac0 = 0;
- XX acinit = 0;
- XX acinit0 = 0;
-
- XX state = ALPHA; /* following the ansi sequence, return to */
- XX break; /* out of state switch */
-
-
- XX case ESC52Y: /* gather next 2 chars */
- XX if(vl) {
- XX pos( c - '\040',vl - '\040');
- XX#ifdef DEBUG
- XX if(debug1)printf("vt52 position %d %d\n",vl-'\40',c-'\40');
- XX#endif DEBUG
- XX vl = 0;
- XX state = ALPHA;
- XX break;
- XX }
- XX else {
- XX vl = c;
- XX break;
- XX }
- XX break;
-
- XX case ESCAPE:
- XX#ifdef DEBUG
- XX if(debug)printf("escape-%c\n",c);
- XX#endif DEBUG
- XX if(vt52mode) {
- XX scroll_top = vtop;
- XX scroll_bottom = vbottom;
- XX switch (c) {
- XX case 'A': pos(curscol,--cursrow); break;
- XX case 'B': pos(curscol,++cursrow); break;
- XX case 'C': pos(++curscol,cursrow); break;
- XX case 'D': pos(--curscol,cursrow); break;
- XX case 'F': graph_52 = 1; break;
- XX case 'G': graph_52 = 0; break;
- XX case 'H': pos(0,0); break;
- XX case 'I': Rindex(); break;
- XX case 'J': cleol(cursrow);
- XX del_lines(cursrow+1,vbottom);
- XX break;
- XX case 'K': cleol(cursrow);
- XX break;
- XX case 'Y': state = ESC52Y;
- XX vl = 0;
- XX break;
- XX case 'Z': ttysw_input(_ttysw,"\033/Z",3);
- XX break;
- XX case '<': vt52mode = 0;
- XX break;
- XX case '>': alt_keypad_52 = 0;
- XX break;
- XX case '=': alt_keypad_52 = 1;
- XX break;
- XX case '1': graph_52 = 1;
- XX break;
- XX case '2': graph_52 = 0;
- XX break;
- XX }
- XX if (state == ESCAPE) state = ALPHA;
- XX break;
- XX }
- XX else
-
- XX switch (c) {
- XX /* detect esc left bracket */
- XX case '[':
- XX state = ESCBRKT;
- XX break;
-
- XX case 'D': Index(); break;
- XX case 'E': pos(0,cursrow);
- XX Index();
- XX break;
- XX case 'H': tabArray[curscol] = 1;
- XX#ifdef DEBUG
- XX if(debug)printf("tab set at %d\n",curscol);
- XX#endif DEBUG
- XX break;
- XX case 'M': Rindex(); break;
- XX case 'Z': ttysw_input(_ttysw,"\033[?1;0c",7);
- XX break;
- XX case '7': Save_cursor(); break;
- XX case '8': Restore_cursor(); break;
- XX case '(': /* G0 char set designator */
- XX state = ESCAPELPRN;
- XX break;
-
- XX case ')': /* G1 char set designator */
- XX state = ESCAPERPRN;
- XX break;
- XX
- XX case '#': /* large char controls */
- XX state = ESCAPESHARP;
- XX break;
-
- XX case '1': /* set graphics option */
- XX break;
- XX
- XX
- XX case '2': /* graphics off */
- XX break;
- XX
- XX case '=': appl_key_ansi = 1;
- XX break;
- XX
- XX case '>': appl_key_ansi = 0;
- XX break;
- XX
- XX case 'c': /* reset power up */
- XX reset();
- XX break;
- XX
- XX
-
- XX /* By default, ignore the character after the ESC */
- XX default: state = ALPHA;
- XX break;
- XX } /* end plain escape sequence */
- XX ac = 0;
- XX ac0 = 0;
- XX acinit = 0;
- XX acinit0 = 0;
- XX if(state == ESCAPE) state = ALPHA;
- XX break;
- XX
- XX default: /* for state switch */
- XX /* don't think we ever get here */
- XX state = ALPHA;
- XX cursor = BLOCKCURSOR;
- XX break;
- XX } /* end of state switch */
- XX loopback: continue;
-
- XX } /* end of while loop */
- XX /* get next character from input */
- XX/* Finished all input. If we have been asked for a report return */
- XX/* appropriate message as function value (hope not much has followed) */
- XX/* EndOuterLoop: */
- XX drawCursor( cursrow, curscol );
- XX return(len0);
-
- XX}
-
-
- XXpos(col, row)
- XX int col, row;
- XX{
- XX int orow;
- XX if (col <= vleft)
- XX col = vleft;
- XX if (col >= vright)
- XX col = vright;
- XX /* mimic vt100 scrolling region anomaly */
- XX if (row <= scroll_top && cursrow >= scroll_top)
- XX row = scroll_top;
- XX if (row >=scroll_bottom && cursrow <= scroll_bottom)
- XX row = scroll_bottom;
- XX orow = cursrow;
- XX#ifdef DEBUG
- XX if(row < 0) trap();
- XX if(debug7) if (col == 0) printf("POS %d: %s\n",row, image[row]);
- XX#endif
- XX if(row < 0)row = 0;
-
- XX cursrow = row;
- XX curscol = col;
- XX vpos(row, col); /* assume 0,0 upper left for SunW */
- XX check_marks(row,orow);
- XX}
-
-
-
-
- XXset_scroll_region()
- XX{
- XX#ifdef DEBUG
- XXif(debug3) printf("entering set_scroll_region %d %d %d\n", acinit, ac, ac0);
- XX#endif DEBUG
- XXif (ac_num == 0 || ac_num == 1 ||(ac_num == 2 && ac == ac0 && ac == 1)) {
- XX
- XX/* default :: reset to whole screen */
- XX scroll_top = vtop;
- XX scroll_bottom = vbottom;
- XX pos(0,0);
- XX return;
- XX }
- XXelse /* set scroll region from pars */
- XXif(ac > ac0) {
- XX scroll_top = ac0-1; /* scroll region start */
- XX scroll_bottom = ac-1; /* " " end */
- XX pos( 0,origin_mode?scroll_top:0);
- XX }
- XX#ifdef DEBUG
- XXif (debug3) printf("scroll region %d %d", scroll_top, scroll_bottom);
- XX#endif DEBUG
- XX}
-
- XXIndex()
- XX{
-
- XX/* if not at bottom of region, then just move down one line */
- XX#ifdef DEBUG
- XX if(debug)printf("Index called %d %d\n",curscol,cursrow);
- XX#endif DEBUG
- XX if (cursrow != scroll_bottom) {
- XX pos(curscol,cursrow+1);
- XX return;
- XX }
- XX if (cursrow == scroll_bottom) {
- XX scroll_up();
- XX shiftMarksUp();
- XX check_marks(cursrow,cursrow-1);
- XX }
- XX}
-
- XXRindex()
- XX{
- XX#ifdef DEBUG
- XX if(debug)printf("Rindex called %d %d\n",curscol,cursrow);
- XX#endif DEBUG
- XX/* if not at top of scroll region, then just move up a line */
- XX if (cursrow != scroll_top) {
- XX pos(curscol,cursrow-1);
- XX return;
- XX }
- XX if (cursrow == scroll_top) {
- XX scroll_down();
- XX shiftMarksDown();
- XX check_marks(cursrow,cursrow+1);
- XX }
-
- XX}
-
- XX/* Scroll up one line at the cursor position -- happens on LF at
- XXbottom of the screen or when ESC-E or D commands step at bottom
- XXmargin -- also linefeed at bottom margin if margins set */
- XXscroll_up()
- XX{
- XX int otop = top;
- XX int obottom = bottom;
- XX top = scroll_top;
- XX bottom = scroll_bottom;
- XX scroll1up(top,bottom);
- XX top = otop;
- XX bottom = obottom;
-
- XX}
-
- XXscroll_down() /* Same as up except that we have to */
- XX{ /* get rid of lines off bottom of screen */
- XX int otop = top;
- XX int obottom = bottom;
- XX top = scroll_top;
- XX bottom = scroll_bottom;
- XX scroll1dn(top, bottom);
- XX top = otop;
- XX bottom = obottom;
-
- XX}
-
- XXint ocursrow, ocurscol, obold, ocharset,og0,og1;
- XX
- XXSave_cursor()
- XX{
- XX ocursrow = cursrow;
- XX ocurscol = curscol;
- XX obold = fillfunc;
- XX ocharset = activeCharset;
- XX og0 = g0;
- XX og1 = g1;
- XX
- XX}
-
- XXRestore_cursor()
- XX{
- XX cursrow = ocursrow;
- XX curscol = ocurscol;
- XX fillfunc = obold;
- XX if(fillfunc & BOLD) Bold_on();
- XX if(fillfunc & UNDER) Under_on();
- XX if(fillfunc & REVERSE) Reverse_on();
- XX activeCharset = ocharset;
- XX grafon();
- XX g0 = og0;
- XX g1 = og1;
- XX set_font(5);
- XX
- XX}
-
- XXchar * estring = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";
-
-
- XXEscreen()
- XX{
- XX int i = 0;
- XX newline = 0;
- XX origin_mode = 0;
- XX wrap = 1;
- XX curscol = 0;
- XX cursrow = 0;
- XX scroll_top = 0;
- XX scroll_bottom = 23;
- XX del_lines(vtop,vbottom);
- XX clearMarks(vtop,vbottom);
- XX estring[vright+1] = '\0';
- XX while (i <= vbottom){
- XX pos(0,i);
- XX writePartialLine(estring,0);
- XX i++;
- XX }
- XX estring[vright+1] = 'E';
- XX pos(0,0);
- XX }
- XX
-
-
- XXanswerback()
- XX{
- XX ttysw_input(_ttysw,answer_message,strlen(answer_message));
- XX}
-
-
- XXreset()
- XX{
- XX newline = 0;
- XX wrap = 1;
- XX origin_mode = 0;
- XX big_screen = 0;
- XX curscol = 0;
- XX cursrow = 0;
- XX fillfunc = 0;
- XX scroll_top = 0;
- XX scroll_bottom = 23;
- XX del_lines(vtop,vbottom);
- XX clearMarks(vtop,vbottom);
- XX vt52mode = 0;
- XX set_font(5);
- XX pos(curscol,cursrow);
- XX}
- XXchar* blanks = " ";
- XXdel_lines(from,to)
- XXint from,to;
- XX{
- XX int i, inverse;
- XX int savec = curscol;
- XX int savel = cursrow;
- XX#ifdef DEBUG
- XX if(debug) printf("deleting from %d to %d\n",from, to);
- XX#endif DEBUG
- XX inverse = fillfunc & REVERSE;
- XX nobold();
- XX blanks[vright+1] = '\0';
- XX for(i= from; i<=to; i++)
- XX {
- XX pos(0,i);
- XX/* writePartialLine(blanks,0); */
- XX vsetlinelength(image[i],0);
- XX }
- XX pclearscreen(from, to+1);
- XX blanks[vright +1] = ' ';
- XX if(inverse) bold();
- XX pos(savec,savel);
- XX}
-
- XXchar buf[MAX_SCREEN_WIDTH];
-
-
- XX/* Writes blanks into line and keeps cursor at original position */
-
- XXdel_char(from,to,row)
- XXint from,to,row;
- XX{
- XX int savec,savel,inverse;
- XX register i = to - from +1;
- XX savec = curscol;
- XX savel = cursrow;
- XX nobold();
- XX cursrow = row;
- XX blanks[i] = '\0';
- XX writePartialLine(blanks, from);
- XX blanks[i] = ' ';
- XX if(fillfunc & REVERSE) bold(); /* restore reverse if set */
- XX pos(savec,savel);
- XX}
-
- XXcleol(row)
- XXint row;
- XX{
- XX int i;
- XX del_char(curscol, vright, row);
- XX vsetlinelength(image[row],curscol);
-
- XX}
-
-
- XX
-
- XX/*special routine for vt100 abs cursor position */
-
- XXabs_pos(col,row)
- XXint row, col;
- XX{
- XX int srow;
- XX int orow;
- XX orow = cursrow;
- XX if (origin_mode){
- XX srow = row + scroll_top;
- XX if(srow > scroll_bottom) srow = scroll_bottom;
- XX }
- XX else srow = row;
- XX curscol = col;
- XX cursrow = srow;
-
- XX#ifdef DEBUG
- XX if(cursrow < 0 ) trap();
- XX if(debug)printf("moving to col %d, row %d \n",col,srow);
- XX#endif DEBUG
- XX vpos(srow,col);
- XX check_marks(cursrow,orow);
- XX}
-
- XXtrap(){}
- XX
- XXpwhite_background()
- XX{
- XX/* pw_blackonwhite(csr_pixwin, 0,1); */
- XX pw_writebackground(csr_pixwin, 0 , 0,
- XX winwidthp, winheightp, PIX_NOT(PIX_DST));
-
-
- XX }
-
- XXpblack_background()
- XX{
- XX/* pw_whiteonblack(csr_pixwin,0,1); */
- XX pw_writebackground(csr_pixwin, 0, 0,
- XX winwidthp, winheightp, PIX_NOT(PIX_DST));
- XX}
-
- XXmark_top(row) /* top of double height row */
- XXint row;
- XX{
- XX int i;
- XX marks[row] &= ~ BOTTOM_F;
- XX marks[row] |= TOP_F|WIDE_F;
- XX for (i = 0; i <= 131; i++){
- XX reflections[row][i] &= ~ BOTTOM_F;
- XX reflections[row][i] |= TOP_F|WIDE_F ;
- XX }
- XX if(length(image[row]) > big_screen ? 66 : 40)
- XX vsetlinelength(image[row],big_screen ? 66 : 40);
- XX rewrite(row);
- XX}
-
-
- XXmark_bottom(row) /* bottom of double height row */
- XXint row;
- XX{
- XX int i;
- XX marks[row] &= ~ TOP_F;
- XX marks[row] |= BOTTOM_F|WIDE_F;
- XX for (i = 0; i <= 131; i++)
- XX {
- XX reflections[row][i] &= ~TOP_F;
- XX reflections[row][i] |= BOTTOM_F|WIDE_F;
- XX }
- XX if(length(image[row]) > big_screen ? 66 : 40)
- XX vsetlinelength(image[row],big_screen ? 66 : 40);
- XX rewrite(row);
- XX}
-
-
- XXclear_width(row) /* set row to non-widte ype */
- XXint row;
- XX{
- XX int i;
- XX marks[row] &= ~(WIDE_F|TOP_F|BOTTOM_F);
- XX for (i = 0; i <= 131; i++)
- XX {
- XX reflections[row][i] &= ~(WIDE_F|TOP_F|BOTTOM_F);
- XX }
- XX
- XX rewrite(row);
- XX}
-
-
- XXmark_wide(row) /* double width -single height row */
- XXint row;
- XX{
- XX int i;
- XX marks[row] &= ~(BOTTOM_F|TOP_F);
- XX marks[row] |= WIDE_F;
- XX for (i = 0; i <= 131; i++)
- XX {
- XX reflections[row][i] &= ~(BOTTOM_F|TOP_F);
- XX reflections[row][i] |= WIDE_F;
- XX }
- XX if(length(image[row]) > big_screen ? 66 : 40)
- XX vsetlinelength(image[row],big_screen ? 66 : 40);
- XX rewrite(row);
- XX}
-
-
- XXG0_select()
- XX{
- XX#ifdef DEBUG
- XX if(debug4) printf("selecting G0 font which is %d\n",G0);
- XX#endif
- XX activeCharset = G0;
- XX set_font(5);
- XX return;
- XX}
-
- XXG1_select()
- XX{
- XX#ifdef DEBUG
- XX if(debug4) printf("selecting G1 font which is %d\n", G1);
- XX#endif
- XX activeCharset = G1;
- XX set_font(5);
- XX return;
- XX}
-
-
-
-
-
-
-
-
-
- XXshiftMarksUp() /* LF or Index has dropped top line */
- XX{
- XX int i,j;
- XX for(i = scroll_top; i < scroll_bottom; i++)
- XX {
- XX marks[i] = marks[i+1];
- XX for (j = 0; j < 132; j++) reflections[i][j] = reflections[i+1][j];
- XX }
- XX marks[scroll_bottom] = big_screen ? NARROW_F : NORMAL_F;/* New line is 80 or 132 cols */
- XX for (j = 0 ; j < 132; j++) reflections[scroll_bottom][j] = marks[scroll_bottom];
- XX}
- XX
- XXshiftMarksDown() /* scroll down has removed bottom line */
- XX{
- XX int i,j;
- XX for ( i = scroll_bottom; i > scroll_top; i--)
- XX {
- XX marks[i] = marks[i-1];
- XX for ( j = 0; j < 132; j++) reflections[i][j] = reflections[i-1][j];
- XX }
- XX marks[scroll_top] = big_screen ? NARROW_F : NORMAL_F;
- XX for(j = 0; j < 132; j++) reflections[scroll_top][j] = marks[scroll_top];
- XX}
-
- XXclearMarks(from,to)
- XXint from,to;
- XX{
- XX int i,j;
- XX for(i = from; i <= to ; i++)
- XX {
- XX marks[i] =big_screen ? NARROW_F : NORMAL_F;
- XX for (j = 0; j< 132; j++) reflections[i][j] = marks[i];
- XX }
-
- XX}
-
- XX
- XXAll_off() /* turn off all attributes */
- XX{
- XX#ifdef DEBUG
- XX if(debug4) printf("All_off entered\n");
- XX#endif
- XX fillfunc = 0;
- XX underscore = 0;
- XX nobold();
- XX set_font(5);
- XX}
-
- XXBold_on()
- XX{
- XX#ifdef DEBUG
- XX if(debug4) printf("Bold_on entered\n");
- XX#endif
- XX fillfunc |= BOLD;
- XX set_font(5);
-
- XX}
-
- XXReverse_on()
- XX{
- XX#ifdef DEBUG
- XX if(debug4) printf("Reverse_on entered\n");
- XX#endif
- XX fillfunc |= REVERSE;
- XX bold();
- XX}
- XXBlink_on() /* can't figure out how to do this */
- XX{
- XX fillfunc |= BLINK;
- XX}
-
- XXUnder_on()
- XX{
- XX underscore = 1;
- XX fillfunc |= UNDER;
- XX}
-
-
- XXscroll1up(tp,bm)
- XXint tp,bm;
- XX{
- XX int i;
- XX char *line;
- XX swapregions ( tp , tp + 1, bm - tp);
- XX line = image[bm];
- XX for(i = 0; i <= right; i++) line[i] = ' ';
- XX vsetlinelength(image[bm],0);
- XX/* pcopyscreen(tp+1,tp,bm-tp); */
- XX pw_copy(csr_pixwin, col_to_x(vleft), row_to_y(tp), winwidthp,
- XX row_to_y(bm -tp), PIX_SRC,
- XX csr_pixwin, col_to_x(vleft), row_to_y(tp + 1));
- XX pclearline(left,right, bm);
- XX
- XX}
- XXscroll1dn(tp,bm)
- XXint tp,bm;
- XX{
- XX int i,k;
- XX char *line;
- XX swapnregions(bm, bm - 1,bm - tp);
- XX line = image[tp];
- XX for(i = 0; i <= right; i++) line[i] = ' ';
- XX vsetlinelength(image[tp],0);
- XX/* pcopyscreen(tp, tp+1, bm-tp);*/
- XX pw_copy(csr_pixwin, col_to_x(vleft), row_to_y(tp+1), winwidthp,
- XX row_to_y(bm -tp), PIX_SRC,
- XX csr_pixwin, col_to_x(vleft), row_to_y(tp));
- XX
- XX pclearline(left,right,tp);
- XX}
-
-
-
- XXswapnregions(a, b, n) /* move block down */
- XX int a, b, n;
- XX{
- XX while (n--)
- XX swap(a--, b--);
- XX}
-
- XXint
- XXsetupfullgraycolormap()
-
- XX{
-
-
- XX register u_char red[CMS_GRAYSSIZE], green[CMS_GRAYSSIZE],
- XX blue[CMS_GRAYSSIZE];
- XX register i;
-
- XX /*
- XX * Initialize to gray cms.
- XX */
- XX/* pw_setcmsname(csr_pixwin, CMS_GRAYS); */
- XX cms_grayssetup(red,green,blue);
- XX pw_putcolormap(csr_pixwin, 0, CMS_GRAYSSIZE, red, green, blue);
- XX return(CMS_GRAYSSIZE);
- XX}
-
-
- @//E*O*F src/ttyvt100.c//
- chmod u=r,g=r,o=r src/ttyvt100.c
-
- echo x - src/vt100keys.c
- sed 's/^XX//' > "src/vt100keys.c" <<'@//E*O*F src/vt100keys.c//'
- XX#ifndef lint
- XXstatic char sccsid[] = "@(#)vt100keys.c 1.6 86/04/11 Copyr 1985 MITRE Corp";
- XX#endif
-
- XX/*
- XX * Copyright (c) 1985 by MITRE Corporation
- XX */
-
- XX#include <stdio.h>
- XX#include <pixrect/pixrect_hs.h>
- XX#include <sunwindow/window_hs.h>
- XX#include <signal.h>
- XX#include <ctype.h>
-
- XX#include <sys/ioctl.h>
- XX#include <sun/fbio.h>
- XX#include <sundev/kbio.h>
- XX#include <sundev/kbd.h>
- XX#include "ttyvt100.h"
- XX#include "charimage.h"
- XX#include "charscreen.h"
- XXextern int vt52mode, curs_key,alt_keypad_52,appl_key_ansi;
- XX/* This routine takes function keys and converts to vt100 key-strings */
- XX/* These depend on the mode settings: */
- XX/* CURSOR KEYS: */
- XX/* vt52_mode */
- XX/* ANSI mode && curs_key mode */
- XX/* ANSI mode && not curs_key mode */
- XX/* AUXILIARY KEYPAD: */
- XX/* vt52mode && numeric */
- XX/* vt52mode && application */
- XX/* ANSI && numeric */
- XX/* ANSI && application */
- XX/********************************* */
- XXextern int newline;
-
- XXchar *
- XXtranslate_key(code)
- XXint code;
- XX{
- XX int flag = 0;
- XX int flagc = 0;
- XX /* Now set up from mode flags: */
- XX flagc = vt52mode; /* that's a 1 0r 0 */
-
- XX#ifdef DEBUG
- XXif(debug2)printf("entered translate with %d\n",code);
- XX#endif DEBUG
-
- XX if(!vt52mode) flagc = 2 + curs_key; /* makes it 2 or 3 */
- XX if(vt52mode && alt_keypad_52) flag = APPL5;
- XX if(vt52mode && !alt_keypad_52)flag = NUMER5;
- XX if(!vt52mode && appl_key_ansi) flag = APPLA;
- XX if(!vt52mode && !appl_key_ansi) flag = NUMERA;
- XX switch(code){
- XX /* Left panel except L1 which */
- XX /* is the hardware abort control (when combined with "a")*/
- XX case KEY_LEFT(2):
- XX case KEY_LEFT(3):
- XX case KEY_LEFT(4):
- XX case KEY_LEFT(5):
- XX case KEY_LEFT(6):
- XX case KEY_LEFT(7):
- XX case KEY_LEFT(8):
- XX case KEY_LEFT(9):
- XX case KEY_LEFT(10): return("");
-
- XX /* right panel but not the cursor keys yet */
- XX /* we will use all 15 as keypad PF1--15*/
-
- XX case KEY_RIGHT(1): /* PF1 */
- XX switch(flag){
- XX case NUMER5: return("\033P");
- XX case NUMERA: return("\033OP");
- XX case APPL5: return("\033P");
- XX case APPLA: return("\033OP");
- XX default: break;
- XX }
- XX return("");
- XX case KEY_RIGHT(2): /* PF2 */
- XX switch(flag){
- XX case NUMER5: return("\033Q");
- XX case NUMERA: return("\033OQ");
- XX case APPL5: return("\033Q");
- XX case APPLA: return("\033OQ");
- XX default: break;
- XX }
- XX return("");
- XX case KEY_RIGHT(3): /* PF3 */
- XX switch(flag){
- XX case NUMER5: return("\033R");
- XX case NUMERA: return("\033OR");
- XX case APPL5: return("\033R");
- XX case APPLA: return("\033OR");
- XX default: break;
- XX }
- XX return("");
- XX case KEY_RIGHT(4): /* 7 */
- XX switch(flag){
- XX case NUMER5: return("7");
- XX case NUMERA: return("7");
- XX case APPL5: return("\033?w");
- XX case APPLA: return("\033Ow");
- XX default: break;
- XX }
- XX return("");
- XX case KEY_RIGHT(5): /* 8 */
- XX switch(flag){
- XX case NUMER5: return("8");
- XX case NUMERA: return("8");
- XX case APPL5: return("\033?x");
- XX case APPLA: return("\033Ox");
- XX default: break;
- XX }
- XX return("");
- XX case KEY_RIGHT(6): /* 9 */
- XX switch(flag){
- XX case NUMER5: return("9");
- XX case NUMERA: return("9");
- XX case APPL5: return("\033?y");
- XX case APPLA: return("\033Oy");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(7): /* 4 */
- XX switch(flag){
- XX case NUMER5: return("4");
- XX case NUMERA: return("4");
- XX case APPL5: return("\033?t");
- XX case APPLA: return("\033Ot");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(8): /* 5 */
- XX switch(flag){
- XX case NUMER5: return("5");
- XX case NUMERA: return("5");
- XX case APPL5: return("\033?u");
- XX case APPLA: return("\033Ou");
- XX default: break;
- XX }
- XX return("");
-
-
- XX case KEY_RIGHT(9): /* 6 */
- XX switch(flag){
- XX case NUMER5: return("6");
- XX case NUMERA: return("6");
- XX case APPL5: return("\033?v");
- XX case APPLA: return("\033Ov");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(10): /* 1 */
- XX switch(flag){
- XX case NUMER5: return("1");
- XX case NUMERA: return("1");
- XX case APPL5: return("\033?q");
- XX case APPLA: return("\033Oq");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(11): /* 2 */
- XX switch(flag){
- XX case NUMER5: return("2");
- XX case NUMERA: return("2");
- XX case APPL5: return("\033?r");
- XX case APPLA: return("\033Or");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(12): /* 3 */
- XX switch(flag){
- XX case NUMER5: return("3");
- XX case NUMERA: return("3");
- XX case APPL5: return("\033?s");
- XX case APPLA: return("\033Os");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(13): /* 0 */
- XX switch(flag){
- XX case NUMER5: return("0");
- XX case NUMERA: return("0");
- XX case APPL5: return("\033?p");
- XX case APPLA: return("\033Op");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_RIGHT(14): /* . */
- XX switch(flag){
- XX case NUMER5: return(".");
- XX case NUMERA: return(".");
- XX case APPL5: return("\033?n");
- XX case APPLA: return("\033On");
- XX default: break;
- XX }
- XX return("");
-
-
- XX case KEY_RIGHT(15): /*ENTER*/
- XX switch(flag){
- XX case NUMERA:
- XX case NUMER5: if(newline)
- XX return("\r\n");
- XX else return("\r");
- XX case APPL5: return("\033?M");
- XX case APPLA: return("\033OM");
- XX default: break;
- XX }
- XX return("");
-
- XX /* Top panel */
- XX case KEY_TOP(1): return("");
- XX case KEY_TOP(2): return("");
- XX case KEY_TOP(3): /* UP */
- XX switch(flagc){
- XX case 1: return("\033A");
- XX case 2: return("\033[A");
- XX case 3: return("\033OA");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(4): /* DOWN */
- XX switch(flagc){
- XX case 1: return("\033B");
- XX case 2: return("\033[B");
- XX case 3: return("\033OB");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(5): /* LEFT */
- XX switch(flagc){
- XX case 1: return("\033D");
- XX case 2: return("\033[D");
- XX case 3: return("\033OD");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(6): /* RIGHT */
- XX switch(flagc){
- XX case 1: return("\033C");
- XX case 2: return("\033[C");
- XX case 3: return("\033OC");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(7): /* PF4 */
- XX switch(flag){
- XX case NUMER5: return("\033S");
- XX case NUMERA: return("\033OS");
- XX case APPL5: return("\033S");
- XX case APPLA: return("\033OS");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(8): /*-(dash)*/
- XX switch(flag){
- XX case NUMER5: return("-");
- XX case NUMERA: return("-");
- XX case APPL5: return("\033?m");
- XX case APPLA: return("\033Om");
- XX default: break;
- XX }
- XX return("");
-
- XX case KEY_TOP(9): /*,comma */
- XX switch(flag){
- XX case NUMER5: return(",");
- XX case NUMERA: return(",");
- XX case APPL5: return("\033?l");
- XX case APPLA: return("\033Ol");
- XX default: break;
- XX }
- XX return("");
- XX default: return("");
- XX }
- XX}
-
-
-
- XX/* This code puts the keyboard into a form that we can use all */
- XX/* the keys as PF-keys as a vt100; i.e. disables the arrow notion */
- XX/* on the keypad. Keys will transmit standard SUN-2 keyboard codes.*/
-
- XX#define MAX_keydefs (sizeof (k_board)/sizeof (*k_board))
- XXint fbdes,
- XX kb;
-
-
-
- XXstruct fbtype fb;
- XXstruct key_id_num {
- XX char *name;
- XX int id_num;
- XX } k_board [] = {
- XX {"'", 87},
- XX {",", 107},
- XX {"-", 40},
- XX {".", 108},
- XX {"/", 109},
- XX {"0", 39},
- XX {"1", 30},
- XX {"2", 31},
- XX {"3", 32},
- XX {"4", 33},
- XX {"5", 34},
- XX {"6", 35},
- XX {"7", 36},
- XX {"8", 37},
- XX {"9", 38},
- XX {";", 86},
- XX {"=", 41},
- XX {"break", 19},
- XX {"bs", 43},
- XX {"del", 66},
- XX {"esc", 29},
- XX {"l1", 1},
- XX {"l10", 97},
- XX {"l2", 3},
- XX {"l3", 25},
- XX {"l4", 26},
- XX {"l5", 49},
- XX {"l6", 51},
- XX {"l7", 72},
- XX {"l8", 73},
- XX {"l9", 95},
- XX {"lf", 111},
- XX {"r1", 21},
- XX {"r10", 91},
- XX {"r11", 92},
- XX {"r12", 93},
- XX {"r13", 112},
- XX {"r14", 113},
- XX {"r15", 114},
- XX {"r2", 22},
- XX {"r3", 23},
- XX {"r4", 45},
- XX {"r5", 46},
- XX {"r6", 47},
- XX {"r7", 68},
- XX {"r8", 69},
- XX {"r9", 70},
- XX {"ret", 89},
- XX {"f1", 5},
- XX {"f2", 6},
- XX {"f3", 8},
- XX {"f4", 10},
- XX {"f5", 12},
- XX {"f6", 14},
- XX {"f7", 16},
- XX {"f8", 17},
- XX {"f9", 18},
- XX {"tab", 53},
- XX {"[", 64},
- XX {"\\", 88},
- XX {"]", 65},
- XX {"`", 42},
- XX {"a", 77},
- XX {"b", 104},
- XX {"c", 102},
- XX {"d", 79},
- XX {"e", 56},
- XX {"f", 80},
- XX {"g", 81},
- XX {"h", 82},
- XX {"i", 61},
- XX {"j", 83},
- XX {"k", 84},
- XX {"l", 85},
- XX {"m", 106},
- XX {"n", 105},
- XX {"o", 62},
- XX {"p", 63},
- XX {"q", 54},
- XX {"r", 57},
- XX {"s", 78},
- XX {"t", 58},
- XX {"u", 60},
- XX {"v", 103},
- XX {"w", 55},
- XX {"x", 101},
- XX {"y", 59},
- XX {"z", 100}
- XX};
- XX/* rf8,10,12,and 14 are the culprits. when the kbd is initialized */
- XX/* they transmit an escape code instead of the standard sun-2 position*/
- XXvoid
- XXinit_kbd()
- XX{
- XX prep_kbd (); /* prepare keyboard */
- XX set_key("r8",RF(8));
- XX set_key("r10",RF(10));
- XX set_key("r12",RF(12));
- XX set_key("r14",RF(14));
-
- XX}
-
- XXint prep_kbd()
- XX{
- XX if ((fbdes = open ("/dev/fb", 2)) < 0) {
- XX fprintf (stderr, "%s: couldn't open framebuffer\n", "ttyvt100");
- XX exit (2);
- XX }
-
- XX if (ioctl (fbdes, FBIOGTYPE, &fb) < 0) {
- XX fprintf (stderr, "%s: couldn't get the fb struct\n", "ttyvt100");
- XX exit (2);
- XX }
-
- XX if (fb.fb_type != FBTYPE_SUN2BW) {
- XX fprintf (stderr, "Sorry, I only do Sun2s\n", "ttyvt100");
- XX exit (2);
- XX }
-
- XX if ((kb = open ("/dev/kbd", 2)) < 0) {
- XX fprintf (stderr, "%s: couldn't open keyboard\n", "ttyvt100");
- XX exit (2);
- XX }
- XX return;
- XX}
-
- XXint set_key(key, keydef)
- XXchar *key;
- XXint keydef;
- XX{
- XX int found_key = FALSE,
- XX i;
-
- XX struct kiockey this_key;
- XX struct kiockey *pk = &this_key;
-
-
- XX switch (*key) {
- XX case 'C':
- XX pk -> kio_tablemask = CTRLMASK;
- XX key++;
- XX break;
- XX case 'S':
- XX pk -> kio_tablemask = SHIFTMASK;
- XX key++;
- XX break;
- XX default:
- XX pk -> kio_tablemask = 0;
- XX break;
- XX }
-
-
- XX for (i = 0; i < MAX_keydefs; i++) {
- XX if (strncmp (key, k_board[i].name, 3) == 0) {
- XX found_key = TRUE;
- XX break;
- XX }
- XX }
-
- XX if (!found_key) {
- XX fprintf (stderr, "%s: couldn't find `%s' key\n", "ttyvt100", key);
- XX exit (2);
- XX }
-
- XX pk -> kio_station = k_board[i].id_num;
-
- XX/* pk -> kio_tablemask = 0; */
-
-
- XX pk -> kio_entry = keydef;
- XX
- XX
- XX/* define key */
-
- XX if (ioctl (kb, KIOCSETKEY, pk) < 0) {
- XX fprintf (stderr, "%s: couldn't define the `%s' key\n", "ttyvt100", key);
- XX exit (2);
- XX }
- XX return;
- XX}
- XX/* end of the keyboard stuff. only do this on entering. whew! */
-
-
- @//E*O*F src/vt100keys.c//
- chmod u=r,g=r,o=r src/vt100keys.c
-
- echo x - MANIFEST
- sed 's/^XX//' > "MANIFEST" <<'@//E*O*F MANIFEST//'
- XXINSTALL 1
- XXMANIFEST 1
- XXMANIFEST 9
- XXdecode.sh 1
- XXfontdir 1
- XXfontdir/uu.gacha.b.8 1
- XXfontdir/uu.gacha.bg.8 1
- XXfontdir/uu.gacha.g.8 1
- XXfontdir/uu.gacha.r.8 1
- XXfontdir/uu.testfont.sh 1
- XXfontdir/uu.thin.b.5 1
- XXfontdir/uu.thin.b.6 1
- XXfontdir/uu.thin.bg.5 2
- XXfontdir/uu.thin.bg.6 2
- XXfontdir/uu.thin.g.5 2
- XXfontdir/uu.thin.g.6 2
- XXfontdir/uu.thin.r.5 2
- XXfontdir/uu.thin.r.6 2
- XXfontdir/uu.thinbot.b.10 2
- XXfontdir/uu.thinbot.bg.10 3
- XXfontdir/uu.thinbot.g.10 3
- XXfontdir/uu.thinbot.r.10 3
- XXfontdir/uu.thintop.b.10 3
- XXfontdir/uu.thintop.bg.10 3
- XXfontdir/uu.thintop.g.10 3
- XXfontdir/uu.thintop.r.10 4
- XXfontdir/uu.thinwide.b.10 4
- XXfontdir/uu.thinwide.bg.10 4
- XXfontdir/uu.thinwide.g.10 4
- XXfontdir/uu.thinwide.r.10 4
- XXfontdir/uu.wide.b.16 4
- XXfontdir/uu.wide.bg.16 5
- XXfontdir/uu.wide.g.16 5
- XXfontdir/uu.wide.r.16 5
- XXfontdir/uu.widebot.b.16 5
- XXfontdir/uu.widebot.bg.16 5
- XXfontdir/uu.widebot.g.16 5
- XXfontdir/uu.widebot.r.16 6
- XXfontdir/uu.widetop.b.16 6
- XXfontdir/uu.widetop.bg.16 6
- XXfontdir/uu.widetop.g.16 6
- XXfontdir/uu.widetop.r.16 6
- XXlibdir 1
- XXlibdir/makefile 1
- XXlibdir/uu.cim_change.o 6
- XXlibdir/uu.cim_size.o 2
- XXlibdir/uu.csr_change.o 7
- XXlibdir/uu.csr_init.o 7
- XXlibdir/uu.ttysw_main.o 7
- XXlibdir/uu.ttyvt100.o 8
- XXlibdir/uu.vt100fonts.o 7
- XXlibdir/uu.vt100keys.o 8
- XXmakefile 1
- XXsrc 3
- XXsrc/README 6
- XXsrc/ttyvt100.c 9
- XXsrc/ttyvt100.h 8
- XXsrc/vt100fonts.c 8
- XXsrc/vt100keys.c 9
- XXvconfig.h 8
- XXvshelltool.icon 6
- XXvt100tool.1 8
- XXvt100tool.c 10
- @//E*O*F MANIFEST//
- chmod u=rw,g=rw,o=rw MANIFEST
-
- echo Inspecting for damage in transit...
- temp=/tmp/sharin$$; dtemp=/tmp/sharout$$
- trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
- cat > $temp <<\!!!
- 1215 3746 27979 ttyvt100.c
- 491 1239 10210 vt100keys.c
- 63 126 1955 MANIFEST
- 1769 5111 40144 total
- !!!
- wc src/ttyvt100.c src/vt100keys.c MANIFEST | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
- if test -s $dtemp
- then echo "Ouch [diff of wc output]:" ; cat $dtemp
- else echo "No problems found."
- fi
- exit 0
-